From 050625298e15a57543ffefcce79ef2bf8edcc184 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Fri, 2 Nov 2001 21:47:27 +0000 Subject: [PATCH] Clean up height code a bit. I don't think it's completely correct yet, but Fri Nov 2 16:45:17 2001 Jonathan Blandford * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code a bit. I don't think it's completely correct yet, but it's getting there. --- ChangeLog | 6 ++++++ ChangeLog.pre-2-0 | 6 ++++++ ChangeLog.pre-2-10 | 6 ++++++ ChangeLog.pre-2-2 | 6 ++++++ ChangeLog.pre-2-4 | 6 ++++++ ChangeLog.pre-2-6 | 6 ++++++ ChangeLog.pre-2-8 | 6 ++++++ gtk/gtkrbtree.c | 42 +++++++++++++++++++++++++++++++++++------- gtk/gtktreeview.c | 4 ++-- gtk/gtktreeview.h | 2 -- 10 files changed, 79 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 848d5ff066..b1f93fd118 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Nov 2 16:45:17 2001 Jonathan Blandford + + * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code + a bit. I don't think it's completely correct yet, but it's + getting there. + Fri Nov 2 16:14:15 2001 Owen Taylor * gtk/gtkviewport.c (gtk_viewport_size_request): Remove diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 848d5ff066..b1f93fd118 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,9 @@ +Fri Nov 2 16:45:17 2001 Jonathan Blandford + + * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code + a bit. I don't think it's completely correct yet, but it's + getting there. + Fri Nov 2 16:14:15 2001 Owen Taylor * gtk/gtkviewport.c (gtk_viewport_size_request): Remove diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 848d5ff066..b1f93fd118 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +Fri Nov 2 16:45:17 2001 Jonathan Blandford + + * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code + a bit. I don't think it's completely correct yet, but it's + getting there. + Fri Nov 2 16:14:15 2001 Owen Taylor * gtk/gtkviewport.c (gtk_viewport_size_request): Remove diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 848d5ff066..b1f93fd118 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,9 @@ +Fri Nov 2 16:45:17 2001 Jonathan Blandford + + * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code + a bit. I don't think it's completely correct yet, but it's + getting there. + Fri Nov 2 16:14:15 2001 Owen Taylor * gtk/gtkviewport.c (gtk_viewport_size_request): Remove diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 848d5ff066..b1f93fd118 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +Fri Nov 2 16:45:17 2001 Jonathan Blandford + + * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code + a bit. I don't think it's completely correct yet, but it's + getting there. + Fri Nov 2 16:14:15 2001 Owen Taylor * gtk/gtkviewport.c (gtk_viewport_size_request): Remove diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 848d5ff066..b1f93fd118 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +Fri Nov 2 16:45:17 2001 Jonathan Blandford + + * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code + a bit. I don't think it's completely correct yet, but it's + getting there. + Fri Nov 2 16:14:15 2001 Owen Taylor * gtk/gtkviewport.c (gtk_viewport_size_request): Remove diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 848d5ff066..b1f93fd118 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +Fri Nov 2 16:45:17 2001 Jonathan Blandford + + * gtk/gtkrbtree.c (_gtk_rbtree_remove_node): Clean up height code + a bit. I don't think it's completely correct yet, but it's + getting there. + Fri Nov 2 16:14:15 2001 Owen Taylor * gtk/gtkviewport.c (gtk_viewport_size_request): Remove diff --git a/gtk/gtkrbtree.c b/gtk/gtkrbtree.c index 82768e7cfa..9b0aaf5047 100644 --- a/gtk/gtkrbtree.c +++ b/gtk/gtkrbtree.c @@ -1055,6 +1055,8 @@ _gtk_rbtree_remove_node (GtkRBTree *tree, GtkRBNode *x, *y; GtkRBTree *tmp_tree; GtkRBNode *tmp_node; + gint node_height; + gint y_height; g_return_if_fail (tree != NULL); g_return_if_fail (node != NULL); @@ -1066,7 +1068,8 @@ _gtk_rbtree_remove_node (GtkRBTree *tree, if (gtk_debug_flags & GTK_DEBUG_TREE) _gtk_rbtree_test (G_STRLOC, tree); - + + if (node->left == tree->nil || node->right == tree->nil) { y = node; @@ -1086,15 +1089,17 @@ _gtk_rbtree_remove_node (GtkRBTree *tree, /* y->count = node->count; */ /* offsets and parity adjust all the way up through parent trees */ - + y_height = GTK_RBNODE_GET_HEIGHT (y); + node_height = GTK_RBNODE_GET_HEIGHT (node) + (node->children?node->children->root->offset:0); + + /* Do this twice for code clarities sake. */ tmp_tree = tree; tmp_node = y; - while (tmp_tree && tmp_node && tmp_node != tmp_tree->nil) { - /* tmp_node->offset -= y->offset; */ - tmp_node->parity -= (guint) 1; /* parity of y is always 1 */ - + tmp_node->offset -= (y_height + (y->children?y->children->root->offset:0)); + tmp_node->parity -= (1 + (y->children?y->children->root->parity:0)); + tmp_node = tmp_node->parent; if (tmp_node == tmp_tree->nil) { @@ -1102,7 +1107,7 @@ _gtk_rbtree_remove_node (GtkRBTree *tree, tmp_tree = tmp_tree->parent_tree; } } - + /* x is y's only child */ if (y->left != tree->nil) x = y->left; @@ -1121,12 +1126,35 @@ _gtk_rbtree_remove_node (GtkRBTree *tree, if (y != node) { + gint diff; + /* Copy the node over */ if (GTK_RBNODE_GET_COLOR (node) == GTK_RBNODE_BLACK) node->flags = ((y->flags & (GTK_RBNODE_NON_COLORS)) | GTK_RBNODE_BLACK); else node->flags = ((y->flags & (GTK_RBNODE_NON_COLORS)) | GTK_RBNODE_RED); node->children = y->children; + + /* We want to see how different our height is from the previous node. + * To do this, we compare our current height with our supposed height. + */ + diff = y_height - GTK_RBNODE_GET_HEIGHT (node); + if (diff != 0) + { + tmp_tree = tree; + tmp_node = node; + + while (tmp_tree && tmp_node && tmp_node != tmp_tree->nil) + { + tmp_node->offset += diff; + tmp_node = tmp_node->parent; + if (tmp_node == tmp_tree->nil) + { + tmp_node = tmp_tree->parent_node; + tmp_tree = tmp_tree->parent_tree; + } + } + } } if (GTK_RBNODE_GET_COLOR (y) == GTK_RBNODE_BLACK) diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index a19cb42900..0673330bd7 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -3012,7 +3012,7 @@ gtk_tree_view_focus_out (GtkWidget *widget, } /* Incremental Reflow */ -#if 0 + static void validate_visible_area (GtkTreeView *tree_view) { @@ -3045,7 +3045,7 @@ install_presize_handler (GtkTreeView *tree_view) { } -#endif + /* Drag-and-drop */ static void diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h index ee70438859..8fbd7efd7c 100644 --- a/gtk/gtktreeview.h +++ b/gtk/gtktreeview.h @@ -312,8 +312,6 @@ void gtk_tree_view_set_destroy_count_func (GtkTreeView *tree_view, GtkDestroyNotify destroy); - - #ifdef __cplusplus } #endif /* __cplusplus */ -- 2.30.2